package co.edu.udea.herbario.dao.imp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import co.edu.udea.herbario.dao.DepartamentoDao;
import co.edu.udea.herbario.dto.Departamento;
import co.edu.udea.herbario.excepcion.Excepcion;

/**
 * Esta clase contiene la implementacion de los metodos planteados en la interface 
 * DepartamentoDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a los departamentos incluidos en la informacion de los ejemplares registrados
 * 
 * @author Lorena Orozco
 *
 */

public class DepartamentoDaoImp extends HibernateDaoSupport implements DepartamentoDao
{
	@Override
	public Departamento obtener(int cod) throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Departamento depar = null;	//inicializacion de objeto tipo Departamento para almacenar el 
									//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Departamento asociado al codigo pasado como parametro
			depar = (Departamento)sesion.get(Departamento.class, cod);			
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return depar;	//retorna el elemento hallado en la tabla Departamento
	}

	@Override
	public int crear(Departamento dep) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			getHibernateTemplate().save(dep);	//crea el elemento dep en la tabla Departamento	
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa		
		}
		catch (HibernateException e)
		{
			res = -1;	//retorna -1 indicando que la operacion fallo
			throw new Excepcion(e);			
		}
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public int eliminar(Departamento dep) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//Modifica el estado del elemento de tipo Departamento dentro del sistema
			dep.setActivo(false);	//Se indica que el departamento esta inactivo
			getHibernateTemplate().update(dep);	//actualiza la informacion del elemento de tipo Departamento
			res = 1;	//almacena 1 como valor de retorno cuando la operacion es exitosa
		}
		catch (HibernateException e)
		{
			res = -1;	//retorna -1 en caso de fallo de la operacion
			throw new Excepcion(e);				
		}

		return res;	//retorna el valor de exito o fallo de la operacion
	}
}
